﻿<?php

class Error404
{
	public function __construct(){		
		$this->referer = getenv("HTTP_REFERER");
		$this->badlink = 'http://'.str_replace("www.", '', $_SERVER['HTTP_HOST']).$_SERVER['REQUEST_URI'];
		self::delegate();
	}
	
	public function redirect_301($to) {
		header("HTTP/1.1 301 Moved Permanently");
		header("Location: ".$to);
		exit();	
	}
	
	/* Вставка / Обновление счетчика рефера если уже есть в базе */
	public function insert_referer($id_badlink) {
		$r =& Registry::get("MDB")->query("SELECT `id`,`count` FROM `".PRFX."error404_request` WHERE `referer`='".$this->referer."' LIMIT 1;");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if(!$r->numRows()) {
			$sql = "INSERT INTO `".PRFX."error404_request` (`id`,`parent`,`referer`,`count`) VALUES ('', '".$id_badlink."', '".$this->referer."', '1');";
		}
		else {			
			$p = $r->fetchRow(MDB2_FETCHMODE_OBJECT);
			$count = $p->count + 1;
			$sql = "UPDATE `".PRFX."error404_request` SET `count` = '".$count."' WHERE `id` = '".$p->id."';";
		}
		$r =& Registry::get("MDB")->query($sql);	
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
	}
	
	/* Если есть в базе, проверяем, выставлен ли для этой ссылки редирект */
	public function in_base()
	{
		$r =& Registry::get("MDB")->query("SELECT `id`,`redirect` FROM `".PRFX."error404` WHERE `badlink`='".$this->badlink."' LIMIT 1;");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		/* Если есть в базе, заносим рефер если он не пуст */
		if($r->numRows())
		{			
			$p = $r->fetchRow(MDB2_FETCHMODE_OBJECT);			
			if(!empty($this->referer)) {
				self::insert_referer($p->id);
			}
			if(!empty($p->redirect)) {
				self::redirect_301($p->redirect);
			}		
		} else {			
			self::insert_badlink();
		}
	}
	
	/* Если нет в базе этой битой ссылки то заносим ее */
	public function insert_badlink() {
		$r =& Registry::get("MDB")->query("INSERT INTO `".PRFX."error404` (`id`,`por`,`badlink`,`redirect`,`date`,`ip`,`client`,`lang`,`ipproxy`,`proxy`) VALUES ('', '".time()."', '".$this->badlink."', '', '".time()."', '".getenv("REMOTE_ADDR")."', '".getenv("HTTP_USER_AGENT")."', '".getenv("HTTP_ACCEPT_LANGUAGE")."', '".getenv("HTTP_X_FORWARDED_FOR")."', '".getenv("HTTP_VIA")."');");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
	}	
	
	public function delegate()
	{		
		echo "404 Not Found";
		self::in_base();
		echo '<meta http-equiv="refresh" content="0.5;url=/">';
		exit();	
	}	
}

